package tools

import (
	"fmt"
	"os"
	"path/filepath"
	"sort"
	"strings"
)

type CallBack func(args []string) (err error)

// Option 命令选项数据结构
type Option struct {
	Cmd      string   // 命令
	CallBack CallBack // 回调
	Help     string   // 帮助说明
}

// ShowHelp 查看帮助选项
func (o *Option) ShowHelp() {
	ItemStdout("    "+o.Cmd, o.Help)
}

// MyTool Mytool数据结构定义
type MyTool struct {
	options map[string]*Option
}

// InitMyTool INIT FUNCTION
func InitMyTool() *MyTool {
	m := new(MyTool)
	m.options = make(map[string]*Option)
	return m
}

// AddOption 添加选项
func (m *MyTool) AddOption(o *Option) *MyTool {
	m.options[o.Cmd] = o
	return m
}

// AddOptions 添加多个选项
func (m *MyTool) AddOptions(options []*Option) *MyTool {
	for _, o := range options {
		m.options[o.Cmd] = o
	}
	return m
}

// 显示使用方法
func (m *MyTool) usage() {
	Out("选项:")
	// 对支持的操作排序
	keys := make([]string, len(m.options))
	i := 0
	for k, _ := range m.options {
		keys[i] = k
		i++
	}
	sort.Strings(keys)

	// 显示命令帮助信息
	for _, v := range keys {
		m.options[v].ShowHelp()
	}
}

func (m *MyTool) MatchCommand(args []string) {
	option := m.options[args[0]]
	if option != nil && option.CallBack != nil {
		err := option.CallBack(args)
		if err != nil {
			fmt.Println(err.Error(), "\nUsage:", option.Help)
		}
	} else {
		m.usage()
	}
}

// RunLoop 运行循环
func (m *MyTool) RunLoop() {
	for {
		path, _ := os.Getwd()
		tips := fmt.Sprintf("[%s@%s %s]# ", CurrentUsername(), Hostname(), filepath.Base(path))
		// 从标准输入获取命令行
		args := strings.Fields(Input(tips, true))
		arrLen := len(args)
		if arrLen == 0 {
			continue
		}
		m.MatchCommand(args)
	}
}
